这篇文章是在初学 Core Animation 的时候记录的。主要是为了之后的回顾
动画
- 直接动画
- 12UIView.animateWithDuration(0.5, delay: 0.5, options: [], animations: {}, completion: nil)
spring弹簧效果
- 12345UIView.animateWithDuration(0.33, delay: 0.0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.0, options: [], animations: {//code}, completion: {_ in//code})
使用关键帧
- 123UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.25, animations: {self.planeImage.center.x += 80.0self.planeImage.center.y -= 10.0 })
通过
CGAffineTransformIdentity
来将形变变回变形前的状态- 1234CGAffineTransformConcat(CGAffineTransformMakeScale(1.0, 0.1), //缩放CGAffineTransformMakeTranslation(0.0, -auxLabelOffset)) } //位移//绑定多个形变
4.
CGAffineTransformMakeRotation
来创建旋转形变
- 1234UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.25, animations: {self.planeImage.center.x += 80.0self.planeImage.center.y -= 10.0 })//通过添加关键帧来设置每个时间,上面的第一个参数为在前面关键帧动画中的百分比
可以修改layer的参数来实现静态动画。
在使用autolayout的时候,可以通过设置对应的参数后使用layoutIfNeed来进行创建动画
通过设置
constraint.active = false
来设置对应的约束是否生效通过创建CAAnimate对象来创建对应的动画,然后将对应的layer使用
setAnimation
来设置对应的内容,key
为后期删除或者修改的时候来设置对应的动画。通过通过设置CABasicAnimated的
fromValue
和toValue
还有duration
来设置动画效果。通过CABasicAnimation的keyPath来确定修改的属性。
通过设置beginTime来设置开始的时间一般为(CACurrentMediaTime()+doubleNmber)
fillMode
用来设置是否在动画谦和后来进行显示。默认为none,一般设置为KCAfillModeBoth
(这样动画前和动画后的操作都不会出现)使用Animatation的实际操作是,隐藏原有对象,然后创建新图片对象,然后操作图片对象,等到图片对象运动完,然后继续显示原对象。(为了不显示原对象,可以设置
removeOnCompletion = false
来进行设置,但是无法操作。)使用delegate来确定animation开始和结束的时间,同时通过KVC来进行设置对应的参数。
通过
layer.removeAnimationForKey
来删除对应的Animation通过AnimationGroup来异步加载所有动画效果,然后通过将CABasicAnimation加入到group中,从而使得动画异步,通过timingFunction来设置动画的速度。
通过CABasicAnimation的repeatCount来设置对应的重复次数,或者通过autoreverses = true来使得不断重复
通过设置speed来调整原来的速度倍速。2为2倍,由于speed的存在,duration的实际时间为除以speed后的时间
通过设置layer.speed后,实际上的速度是animation.Speed * view.layer.speed的速度,而且layer的speed作用于他的子layer
UIKit(UIView.animationWithDuration)相对Core Animation更加强制。Core Animation可以设置更多参数,但是不能设置duration,duration会自行计算。
CASpringAnimation如果设置了duration,如果duration小于实际时长的话,那么当到达duration的话,就会直接跳到结束。可以用duration = pulse.settlingDuration 来进行设置
CASprintAnimation常见参数
- damping为阻尼,默认为10
- mass为,默认为1
- stiffness,默认为100
- initialivelocity,默认为0
使用CAKeyframeAnimation来代替animationWithKeyframe,通过values来设置每一帧的值,通过keyTimes来设置对应的转动的百分比时间。
通过NSValue(CGPoint())来将CGPoint转化为value,如果需要转换的为数组,那么使用map{NSValue(CGPoint:$0)}
通过对layer进行添加animation来发生形变,同时通过UIView.durationWithAnimation中的complete,从而更加方便的进行回调。从而不需要调用delegate
通过CAGradientLayer来创建渐变图层,左上为(0,0)右下为(1,1),color属性设置颜色,locations属性设置颜色位置
通过layer.mask = CALayer(),来设置对应的遮罩层,从而显示图像。
设置UIGraphicsBeginImageContextWithOptions中的scale为0,从而使得对应的图像分辨率为显示器的分辨率
通过使用CAShapeLayer来创建纯线的描绘,设置start和end,从而显示位置,为百分比。LineDashPattern的数组来设置哪几块绘制。
kCAAnimationDiscrete 是一帧一帧,每一帧都要代码计算得到,而kCAAnimationPaced则是平滑的动画效果。
对于重复的动画,使用CAReplicatorLayer(),然后将需要重复的内容加入其中,同时设置instanceCount(重复个数),instanceTransform(重复的位置),instanceDelay(重复内容的动画延迟时间)
通过CATransform3DIdentity,从而获得对应的齐次矩阵,然后设置透视角度,identity.m34 = -1.0/1000,一般为250~2000,小于250,因为太大而形变,大于2000,基本平行,则没感觉。然后通过CATransform3dMakeXXXX这类函数进行形变,对矩阵进行设置,从而变形对应的对象。
设置layer的sublayerTransform属性,从而使得所有子layer都遵守这个透视图。
对于layer的animation的操作,不仅仅要给予layer的动画效果,还要设置最后的transform后的效果。
对于粒子效果,可以通过创建CAEmitterLayer来创建
- emitterShape:设置粒子效果(发射方向
- emitterPosition:喷射点
- emitterSize:喷射区域大小
- emitterCells:粒子种类
- CAEmitterCell来设置对应的粒子
- contents:图片样式
- birthRate:每秒产生个数
- lifetime:每个生命周期
- lifetimeRange:声明周期误差(正负)
- yAcceleration:y轴加速度
- xAcceleration:x轴加速度
- velocity:初始速度
- emissionLongitude:初始方向
- velocityRange:速度误差值
- emissionRange:方向误差值
- redRange,greenRange,blueRange:红蓝绿的颜色类型
- scale:缩放
- scaleRange:缩放误差
- scaleSpeed:缩放速度
- alphaRange:透明度范围
CGAffineTransformMakeScale(-1, 1)即将图片翻转
通过UIImageView.animationImages = [UIImages]来设置逐帧动画,animationDuration来设置动画时长,animationRepeatCount来设置重复次数,使用startAnimating来执行动画
UIViewController转换的方法:
首先创建对应的动画对象,遵守UIViewControllerAnimatedTransitioning协议
- 在需要跳转的对应的VC上遵守UIViewControllerTransitioningDelegate协议
- 重写animationControllerForPresentedController方法,返回需要调用的动画对象,
- 在动画对象中transitionDuration,返回动画时间
- 在animateTransition设置动画效果。
- 基本思路是,fromVC刚开始被container所包裹(transitionContext),一开始的时候,toVC不存在,这个时候需要创建,并将对应的VC加入到container中,在duration结束后,transitionContext.completeTransition(true),从而告诉UIKit结束动画。
UINavigationController跳转动画,
创建对应的动画对象,遵守UIViewControllerAnimatedTransitioning协议
- 在需要跳转的对应的VC上遵守UINavigationControllerTransitioningDelegate协议
- 在navigationController方法总返回跳转对象transition,同时设置oepration方向(PUSH还是POP
- 动画对象中设置duration时长和设置的动画。根据不同的operation的方向来决定动画效果。
- 在animationTransition设置点动画效果
- 同UIViewController
具有交互的跳转动画
动画对象继承UIPercentDrivenInteractiveTransition(不在使用继承NSObject)
其余和上相同
根据手势的不同状态,比如说recgnizer.state调用updateInteractiveTransition(progress)//更新图像,让界面进行重绘
startInteractiveTransition(progress)//开始更新图像图像
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态
kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.